package models

import (
	"time"
)

// Bookmark 网址收藏模型，对应数据库中的bookmarks表
type Bookmark struct {
	ID          uint      `gorm:"primaryKey;autoIncrement" json:"id"`      // 主键，自增
	Title       string    `gorm:"type:varchar(255);not null" json:"title"` // 网址标题
	URL         string    `gorm:"type:text;not null" json:"url"`           // 网址路由
	Description string    `gorm:"type:text" json:"description"`            // 网址描述
	Favicon     string    `gorm:"type:varchar(500)" json:"favicon"`        // 网站图标URL
	CategoryID  *uint     `gorm:"index" json:"category_id"`                // 分类ID，可为空
	UserID      uint      `gorm:"not null;index" json:"user_id"`           // 用户ID
	VisitCount  int       `gorm:"default:0" json:"visit_count"`            // 访问次数
	CreatedAt   time.Time `json:"created_at"`                              // 创建时间
	UpdatedAt   time.Time `json:"updated_at"`                              // 更新时间

	// 关联关系
	Category *Category `gorm:"foreignKey:CategoryID" json:"category,omitempty"` // 所属分类
	User     User      `gorm:"foreignKey:UserID" json:"user,omitempty"`         // 所属用户
}

// TableName 指定表名
func (Bookmark) TableName() string {
	return "bookmarks"
}

// BookmarkCreateRequest 创建网址收藏请求结构体
type BookmarkCreateRequest struct {
	Title       string `json:"title" binding:"required,min=1,max=255"` // 网址标题，必填，1-255字符
	URL         string `json:"url" binding:"required,url"`             // 网址路由，必填，URL格式
	Description string `json:"description"`                            // 网址描述，可选
	CategoryID  *uint  `json:"category_id"`                            // 分类ID，可选
}

// BookmarkUpdateRequest 更新网址收藏请求结构体
type BookmarkUpdateRequest struct {
	Title       string `json:"title" binding:"omitempty,min=1,max=255"` // 网址标题，可选，1-255字符
	URL         string `json:"url" binding:"omitempty,url"`             // 网址路由，可选，URL格式
	Description string `json:"description"`                             // 网址描述，可选
	CategoryID  *uint  `json:"category_id"`                             // 分类ID，可选
}

// BookmarkQueryRequest 网址收藏查询请求结构体
type BookmarkQueryRequest struct {
	Page       int    `form:"page" binding:"min=1"`      // 页码，最小为1
	PageSize   int    `form:"page_size" binding:"min=1"` // 每页数量，最小为1
	Search     string `form:"search"`                    // 搜索关键词
	CategoryID *uint  `form:"category_id"`               // 分类ID筛选
}

// BookmarkBatchRequest 批量操作请求结构体
type BookmarkBatchRequest struct {
	BookmarkIDs []uint `json:"bookmark_ids" binding:"required,min=1"`       // 网址ID列表，必填，至少1个
	Action      string `json:"action" binding:"required,oneof=delete move"` // 操作类型：delete删除，move移动
	CategoryID  *uint  `json:"category_id"`                                 // 目标分类ID（移动操作时使用）
}

// BookmarkResponse 网址收藏响应结构体
type BookmarkResponse struct {
	ID          uint              `json:"id"`
	Title       string            `json:"title"`
	URL         string            `json:"url"`
	Description string            `json:"description"`
	Favicon     string            `json:"favicon"`
	CategoryID  *uint             `json:"category_id"`
	UserID      uint              `json:"user_id"`
	VisitCount  int               `json:"visit_count"`
	CreatedAt   time.Time         `json:"created_at"`
	UpdatedAt   time.Time         `json:"updated_at"`
	Category    *CategoryResponse `json:"category,omitempty"`
}

// BookmarkListResponse 网址收藏列表响应结构体
type BookmarkListResponse struct {
	Bookmarks  []*BookmarkResponse `json:"bookmarks"`
	Total      int64               `json:"total"`
	Page       int                 `json:"page"`
	PageSize   int                 `json:"page_size"`
	TotalPages int                 `json:"total_pages"`
}

// BookmarkPreviewResponse 网址预览响应结构体
type BookmarkPreviewResponse struct {
	Title   string `json:"title"`   // 网站标题
	Favicon string `json:"favicon"` // 网站图标
	URL     string `json:"url"`     // 原始URL
}

// ToResponse 将Bookmark转换为BookmarkResponse
func (b *Bookmark) ToResponse() *BookmarkResponse {
	resp := &BookmarkResponse{
		ID:          b.ID,
		Title:       b.Title,
		URL:         b.URL,
		Description: b.Description,
		Favicon:     b.Favicon,
		CategoryID:  b.CategoryID,
		UserID:      b.UserID,
		VisitCount:  b.VisitCount,
		CreatedAt:   b.CreatedAt,
		UpdatedAt:   b.UpdatedAt,
	}

	// 转换分类信息
	if b.Category != nil {
		resp.Category = b.Category.ToResponse()
	}

	return resp
}
